iT邦幫忙

2025 iThome 鐵人賽

DAY 19
0
Software Development

30 天精通 C 語言建置與除錯:從 Makefile 到 CMake 跨平台實戰系列 第 19

[Day 19] [make→cmake] 用cmake補足makefile的限制

  • 分享至 

  • xImage
  •  

make 痛點回顧

簡而言之

  • GCC/Clang/MSVC 旗標差很大,同一份 Makefile 要在 Linux/macOS/Windows 都順跑很難
  • 可以參考Day 18 的內容

這篇文章會學到的

  • 列出Cmake常用的語法,可以補足make的部分
  • 針對不同痛點對應的cmake關鍵語法

下篇文會學到的

  • 如何正確使用下面列舉的指令 /images/emoticon/emoticon03.gif

CMake 的優勢

  • 同一份 CMakeLists.txt 就能產生 Ninja/makefile
  • 目標導向 API設定編譯/連結屬性(target_*),CMake 會幫你轉換成各平台正確參數
  • 內建 MSVCAPPLEUNIXCMAKE_SYSTEM_NAME 等條件分支,必要時才做平台特例
    /images/emoticon/emoticon02.gif
    os:其實我常常在想為何要有那麼多平台,作業系統,可能是人類真的都太聰明太有創意 XD

針對Day 18的內容整理cmake可以補足make缺點的關鍵

1. 可攜性差、容易綁平台 →一次描述,多產生器/多平台輸出

關鍵語法: projectadd_executableadd_librarytarget_include_directoriestarget_link_librariesadd_compile_optionstarget_compile_definitionstarget_compile_featurestarget_link_optionsinstall

2.Make容易產生不完整相依圖 →CMake 自動追蹤依賴

關鍵語法target_sources(FILE_SET HEADERS ...)add_custom_command(OUTPUT ...)add_custom_targetadd_dependencies

3. 工具鏈與功能偵測繁瑣 → CMake 工具鏈/功能偵測(旗標、特性、交叉編譯

關鍵語法include(CheckCXXCompilerFlag)check_cxx_compiler_flagtry_compileset(CMAKE_*_COMPILER ...)CMAKE_SYSROOTCMAKE_FIND_ROOT_PATH*

4. 外部函式庫管理不便 → cmake 外部函式庫管理(系統庫或抓原始碼建置)

關鍵語法find_packageinclude(FetchContent)FetchContent_DeclareFetchContent_MakeAvailablefind_package(PkgConfig)pkg_check_modules


# compile_commands.json:clangd/clang-tidy 
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)

add_library(core STATIC src/core.cpp)
target_include_directories(core PUBLIC ${CMAKE_SOURCE_DIR}/include)

add_executable(app src/main.cpp)
target_link_libraries(app PRIVATE core)

# 測試
include(CTest)
enable_testing()

add_executable(core_test tests/core_test.cpp)
target_link_libraries(core_test PRIVATE core)
add_test(NAME core_add_test COMMAND core_test)

5. IDE/工具整合弱 →Cmake IDE/工具整合(VS/Xcode 工程、clangd、CTest)

關鍵語法:set(CMAKE_EXPORT_COMPILE_COMMANDS ON)include(CTest)enable_testingadd_test

6. 不好模組化 → cmake 模組化/傳遞屬性(目標導向 API)

關鍵語法add_subdirectorytarget_include_directories(PUBLIC/PRIVATE/INTERFACE)、target_link_libraries(PUBLIC/...)、target_compile_definitionstarget_compile_features

7. 安裝/打包/部署四分五裂 → cmake install() + CPack 一條龍

關鍵語法install(TARGETS ...)install(DIRECTORY ...)include(CPack)set(CPACK_*)

8.開發體驗(多組態、預設參數、跨平台設定)→CMakePresets.json

關鍵內建CMakePresets.json(不是指令,但 CMake 原生支援)

9.常用功能開關(強大)

關鍵語法: optionfind_package(OpenMP)target_link_libraries(Imported targets)


上一篇
[Day 18] [make → cmake] makefile在大型專案中的問題
下一篇
[Day 20] [make→cmake] 執行人生中第一個CmakeList
系列文
30 天精通 C 語言建置與除錯:從 Makefile 到 CMake 跨平台實戰24
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言